import 'dart:developer' as dev;

import 'package:flutter/material.dart';
import 'package:ideology/features/screens/widgets/editor_area/code_editor_business.dart';
import 'package:ideology/features/screens/widgets/editor_menu_bar/dialogs/new_project_dialog/new_project_dialog.dart';
import 'package:ideology/features/screens/widgets/editor_menu_bar/menu_actions.dart';

/// 菜单动作处理器抽象接口。
///
/// 用于定义统一的菜单动作分发规范，避免 UI 与业务逻辑直接耦合。
abstract class MenuActionHandler {
  /// 处理一个 [MenuAction]。
  ///
  /// 可能包含异步逻辑，因此返回 [Future]。
  Future<void> handle(MenuAction action);
}

/// 默认的菜单动作处理器实现。
///
/// - 负责调用 [CodeEditorUseCases] 中对应的业务逻辑；
/// - 在外层统一捕获异常并通过 [ScaffoldMessengerState] 提示；
/// - 不包含任何 UI / 样式逻辑，仅专注于业务分发。
class DefaultMenuActionHandler implements MenuActionHandler {
  DefaultMenuActionHandler({required this.useCases, required this.messenger});

  /// 编辑器业务用例集合。
  final CodeEditorUseCases useCases;

  /// 用于展示错误提示的 [ScaffoldMessengerState]。
  final ScaffoldMessengerState messenger;

  @override
  Future<void> handle(MenuAction action) async {
    try {
      switch (action) {
        case MenuAction.newProject:
        // 创建新项目，默认使用一套模板参数
          await useCases.newProjectWith(
            NewProjectData(
              name: 'untitled',
              location: null, // 让控制器内部弹出目录选择器
              buildSystem: 'Snow Modules',
              group: 'com.example',
              withSample: true,
            ),
          );
          break;

        case MenuAction.openProject:
          await useCases.openProject();
          break;

        case MenuAction.closeProject:
          useCases.closeProject();
          break;

        case MenuAction.runProject:
          await useCases.runProject();
          break;

        case MenuAction.debugProject:
          await useCases.debugProject();
          break;
      }
    } catch (e, st) {
      // 统一异常处理：写入日志 + 提示用户
      dev.log('menu action failed', error: e, stackTrace: st);
      messenger.showSnackBar(SnackBar(content: Text('操作失败: $e')));
    }
  }
}
